The proliferation of computers and the advent of the Internet and the maturing of the World Wide Web (“web”) have significantly increased the use of distributed application programs. Examples of distributed application programs include collaboration programs, chat room programs, instant messaging programs, conferencing programs, gaming programs, and the like. Each of these application programs enable multiple, geographically distributed computer users to interactively exchange information in real time.
One prevalent method of creating the distributed application programs is to use object-oriented programming. Object-oriented programming is a method of creating computer programs by combining or linking reusable components, called “objects,” to create applications. An object is a programming unit containing both data and instructions for performing operations on that data. In object-oriented programming, the operations are referred to as “methods.”
Object-oriented application programs use objects to define their data and the methods that operate on the data. Typically, two objects communicate with each other via messages, which include a protocol that defines the method of communication. In distributed application programs, these objects can reside, for example, on different computing systems and across networks, within different application processes running on the same computing system, within different components/subcomponents running within the same process, different processes, or a different process on a different computing system. Distributed computing is frequently based on the client-server paradigm, and in client-server terminology, the requesting object is referred to as the client object and the servicing object is referred to as the server object.
In a distributed configuration where different subsystems—e.g., an instance of a distributed application program on a client computing system and an instance of the distributed application program on a server computing system—use distributed objects (DOs) as the mechanism for communication, the DOs are typically connected or coupled in pairs through respective remote proxy objects. For example, a client DO (the DO executing on a client computing system) uses a remote proxy object on the client computing system which models the interface of the server DO (the connected DO on the server computing system). The remote proxy object on the client computing system contains the necessary protocol information to allow the client DO to access and manipulate the server DO. Conversely, the server DO uses a remote proxy object on the server computing system which models the interface of the client DO, and the remote proxy object on the server computing system contains the necessary protocol information to allow the server DO to access and manipulate the client DO. In this regard, an interface is a collection of methods that two communicating subsystems have agreed upon before the subsystems start communicating.
Thus, in order for two subsystems to communicate with each other, the communicating subsystems need to use a single version of the interface—e.g., the remote proxy object used by the client DO needs to have the same interface version as the remote proxy object used by the server DO. Stated differently, when a source subsystem communicates with another target subsystem, the version of the interface needs to match, for example, that of the target subsystem. Since distributed applications are regularly updated to provide additional or improved features, it is inevitable that numerous versions of subsystems will need to communicate.
Currently, a subsystem that needs to communicate with different versions of a remote subsystem needs to use a different interface, one interface for each version. For example, a source subsystem that needs to communicate with two versions of a remote subsystem—e.g., one remote subsystem that supports version 1 of the interface, and a second remote subsystem that supports version 2 of the interface—will need to support both the version 1 interface and the version 2 interface. This will then allow the source subsystem to create a remote client proxy that supports the version 1 interface to communicate with the remote subsystem that supports version 1 of the interface, and a remote client proxy that supports the version 2 interface to communicate with the remote subsystem that supports version 2 of the interface. In order to support both the version 1 interface and the version 2 interface, the source subsystem code needs to be duplicated—i.e., one copy of the code that supports the version 1 interface, and another copy of the code that supports the version 2 interface—in order to account for the different “types.” One drawback is the waste associated with the duplication of effort. For example, even in instances where the difference between the two versions of the interface is minimal and only affects a very small portion of the subsystem code, the programmer still needs to change the code to account for the new types.
It would be desirable to have a technique that would allow a source subsystem to communicate with target subsystems of differing interface versions without having to duplicate identical code between different versions.